package com.leyou.item.controller;

import com.leyou.item.pojo.SpecParam;
import com.leyou.item.pojo.SpecGroup;
import com.leyou.item.service.SpecService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("spec")
public class SpecController {

    @Autowired
    private SpecService specService;

    /**
     * 根据请求的商品大类编号，返回大类组信息。
     *
     * @param cid：大类编号 主体
     *                 基本信息
     *                 操作系统
     *                 主芯片
     *                 存储
     *                 摄像头
     *                 电池信息
     *                 ...
     * @return
     */
    @GetMapping("groups/{cid}")
    public ResponseEntity<List<SpecGroup>> queryGroupByCid(@PathVariable(name = "cid") Long cid) {
        List<SpecGroup> groups = this.specService.queryGroupByCid(cid);
        if (CollectionUtils.isEmpty(groups)) {
            return ResponseEntity.notFound().build();
        }
        return ResponseEntity.ok(groups);
    }

    /**
     * 修改组 (使用PutMapping接收的数据类型必须是 “key=xx&key=xx” 这样的查询字符串的格式，要不然无法封装成对象)
     *
     * @param specGroup
     * @return
     */
    @PutMapping("group")
    public ResponseEntity<Void> editGroup(SpecGroup specGroup) {
        this.specService.editGroup(specGroup);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

    /**
     * 删除组
     *
     * @param id
     * @return
     */
    @DeleteMapping("group/{id}")
    public ResponseEntity<Void> deleteGroup(@PathVariable(name = "id") Long id) {
        this.specService.deleteGroup(id);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

    /**
     * 添加组
     *
     * @param specGroup
     * @return
     */
    @PostMapping("group")
    public ResponseEntity<Void> addGroup(SpecGroup specGroup) {
        this.specService.addGroup(specGroup);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }


    /**
     * 获取大类组里面的属性方法，跟上面第一个获取大类一样
     * 新增商品根据大类的cid获取属性方法也是这个请求，在这个controller里改造下2个都能用
     *
     * @param gid
     * @return
     */
    @GetMapping("params")
    public ResponseEntity<List<SpecParam>> queryParamsByCid(
            // 都不是必传的参数   required = false
            @RequestParam(value = "gid", required = false) Long gid,  // 根据属性组里的gid去查属性
            @RequestParam(value = "cid", required = false) Long cid,  // 根据商品标准params里根据cid去查属性
            @RequestParam(value = "generic", required = false) Boolean generic, // generic是否是非标，false代表0，true代表1 ; 0是非标代表内存、存储、颜色这些。
            @RequestParam(value = "searching", required = false) Boolean searching) { // 是否参与搜索 也是布尔值

        List<SpecParam> params = this.specService.queryParamsByCid(gid, cid, generic, searching);
        if (CollectionUtils.isEmpty(params)) {
            ResponseEntity.notFound().build();
        }
        return ResponseEntity.ok(params);

    }

    /**
     * 新增大类里的属性方法，使用post方式请求。注意请求的参数需要转成“查询字符串”！
     *
     * @param specParam
     * @return
     */
    @PostMapping("param")
    public ResponseEntity<Void> addSpecParams(SpecParam specParam) {
        // 如果name没有传，直接返回
        if (StringUtils.isBlank(specParam.getName())) {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
        } else {
            this.specService.addSpecParams(specParam);
            return ResponseEntity.status(HttpStatus.CREATED).build();
        }
    }

    /**
     * 大类里属性的修改方法，使用put方式请求,同上，使用一个接口
     *
     * @param specParam
     * @return
     */
    @PutMapping("param")
    public ResponseEntity<Void> editSpecParams(SpecParam specParam) {
        this.specService.editSpecParams(specParam);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

    /**
     * 大类里属性的删除方法，使用DELETE请求
     *
     * @param id
     * @return
     */
    @DeleteMapping("param/{id}")
    public ResponseEntity<Void> deleteSpecParams(@PathVariable("id") Long id) {
        this.specService.deleteParams(id);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

    /*
        查询每个规格参数下面详细的参数
     */
    @GetMapping("{cid}")
    public ResponseEntity<List<SpecGroup>> querySpecsByCid(@PathVariable Long cid) {
        List<SpecGroup> groups = this.specService.querySpecsByCid(cid);
        if (CollectionUtils.isEmpty(groups)) {
            return ResponseEntity.notFound().build();
        }
        return ResponseEntity.ok(groups);
    }
}
